export function debounce(func, wait, immediate) {
 let timeout, args, context, timestamp, result;

 const later = function () {
  // 据上一次触发时间间隔
  const last = +new Date() - timestamp;

  // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
  if (last < wait && last > 0) {
   timeout = setTimeout(later, wait - last);
  } else {
   timeout = null;
   // 如果设定为immediate===true，因为开始边界已经调用过了此处无需调用
   if (!immediate) {
    result = func.apply(context, args);
    if (!timeout) context = args = null;
   }
  }
 };

 return function (...args) {
  context = this;
  timestamp = +new Date();
  const callNow = immediate && !timeout;
  // 如果延时不存在，重新设定延时
  if (!timeout) timeout = setTimeout(later, wait);
  if (callNow) {
   result = func.apply(context, args);
   context = args = null;
  }

  return result;
 };
}

/**
 * @param {date} time 需要转换的时间
 * @param {String} fmt 需要转换的格式 如 yyyy-MM-dd、yyyy-MM-dd HH:mm:ss
 */
export function formatTime(time, fmt) {
 if (!time) return '';
 else {
  const date = new Date(time);
  const o = {
   'M+': date.getMonth() + 1,
   'd+': date.getDate(),
   'H+': date.getHours(),
   'm+': date.getMinutes(),
   's+': date.getSeconds(),
   'q+': Math.floor((date.getMonth() + 3) / 3),
   S: date.getMilliseconds(),
  };
  if (/(y+)/.test(fmt))
   fmt = fmt.replace(
    RegExp.$1,
    (date.getFullYear() + '').substr(4 - RegExp.$1.length)
   );
  for (const k in o) {
   if (new RegExp('(' + k + ')').test(fmt)) {
    fmt = fmt.replace(
     RegExp.$1,
     RegExp.$1.length === 1
      ? o[k]
      : ('00' + o[k]).substr(('' + o[k]).length)
    );
   }
  }
  return fmt;
 }
}

/**
 *
 * @param {number} len 随机字符串的长度
 */
export function randomString(len) {
 len = len || 32;
 let $chars =
  'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'; /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/
 let maxPos = $chars.length;
 let pwd = '';
 for (let i = 0; i < len; i++) {
  pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
 }
 return pwd;
}

/**
 * 每三个数字加逗号，位数刚好是 3 的倍数头部不会加逗号
 * @param {number & !0XXXX} num 需要格式化的数字,不能以 0 开头
 */

export function toThousands(num) {
 let result = '';
 num = (num || 0).toString();
 while (num.length > 3) {
  result = ',' + num.slice(-3) + result;
  num = num.slice(0, num.length - 3);
 }
 if (num) {
  result = num + result;
 }
 return result;
}
